package archive

import (
	"fmt"
	"github.com/gogf/gf/v2/text/gstr"
)

type Tar struct{}

func (r *Tar) Archive(source []string, destination string) error {
	fmt.Printf("tar archive\n")
	fmt.Printf("source: %s\n", gstr.Implode(" ", source))
	fmt.Printf("destination: %s\n", destination)
	return nil
}

func (r *Tar) Extract(source string, destination []string) error {
	fmt.Printf("tar extract\n")
	fmt.Printf("source: %s\n", source)
	fmt.Printf("destination: %s\n", gstr.Implode(" ", destination))
	return nil
}

//var ArchiveTar = &archiveTar{}
//
//type archiveTar struct{}
//
//func (receiver *archiveTar) Tarx(source, target string) error {
//	fileReader, err := os.Open(source)
//	if err != nil {
//		return err
//	}
//	defer fileReader.Close()
//
//	tarReader := tar.NewReader(fileReader)
//
//	// target path
//	err = os.MkdirAll(target, os.ModePerm)
//	if err != nil {
//		return err
//	}
//
//	for {
//		hdr, err := tarReader.Next()
//		if err == io.EOF {
//			break
//		}
//		if err != nil {
//			return err
//		}
//
//		fileName := target + hdr.Name
//
//		switch hdr.Typeflag {
//		case tar.TypeDir:
//			err = os.MkdirAll(hdr.Name, os.ModePerm)
//			if err != nil {
//				return err
//			}
//		case tar.TypeReg, tar.TypeRegA:
//			fileWriter, err := os.Create(hdr.Name)
//			if err != nil {
//				return err
//			}
//			defer fileWriter.Close()
//
//			_, err = io.Copy(fileWriter, tarReader)
//			if err != nil {
//				return err
//			}
//
//			fileInfo := hdr.FileInfo()
//			_ = os.Chmod(fileName, fileInfo.Mode().Perm())
//		}
//	}
//
//	return nil
//}
//func (receiver *archiveTar) Tarc(source, target string) error {
//	fileWriter, err := os.Create(target)
//	if err != nil {
//		return err
//	}
//	defer fileWriter.Close()
//
//	tarWriter := tar.NewWriter(fileWriter)
//
//	return filepath.Walk(source, func(item string, fileInfo os.FileInfo, err error) error {
//		var relative string
//
//		if item == source {
//			if fileInfo.IsDir() {
//				return nil
//			}
//
//			relative = gfile.Basename(item)
//		} else {
//			relative = strings.TrimPrefix(item, source)
//		}
//
//		header, err := tar.FileInfoHeader(fileInfo, "")
//		if err != nil {
//			return err
//		}
//
//		header.Name = relative
//
//		if err = tarWriter.WriteHeader(header); err != nil {
//			return err
//		}
//
//		if fileInfo.IsDir() {
//			os.Mkdir(relative, os.ModeDir)
//		} else {
//			fileReader, err := os.Open(item)
//			if err != nil {
//				return err
//			}
//			defer fileReader.Close()
//
//			if _, err = io.Copy(tarWriter, fileReader); err != nil {
//				return err
//			}
//		}
//
//		return nil
//	})
//}
//func (receiver *archiveTar) Header(source string) (*tar.Header, error) {
//	fileInfo, err := os.Stat(source)
//	if err != nil {
//		return nil, err
//	}
//
//	header, err := tar.FileInfoHeader(fileInfo, "")
//	if err != nil {
//		return nil, err
//	}
//
//	return header, nil
//}
